package seqlist.array.leetcode;

/**
 * @author yuisama
 * @date 2023/03/09 19:49
 * 轮转数组
 **/
public class Num189_RotateArray {
    // 1.取余法
//    public void rotate(int[] nums, int k) {
//        // 开辟一个和原数组长度完全相同的新数组
//        int[] array = new int[nums.length];
//        // 遍历原数组，将每个元素移动3步之后写到新数组的对应下标
//        // (i + k) % nums.length
//        for (int i = 0; i < nums.length; i++) {
//            array[(i + k) % nums.length] = nums[i];
//        }
//        // 写回原数组
//        for (int i = 0; i < nums.length; i++) {
//            nums[i] = array[i];
//        }
//    }
    // 2.反转数组法
    public void rotate(int[] nums, int k) {
        k  = k % nums.length;
        // 1.对整个nums数组反转，将前面的元素与后面元素交换
        reverse(nums,0,nums.length - 1);
        // 2.再分别对两个子数组进行反转处理
        reverse(nums,0,k - 1);
        reverse(nums,k,nums.length - 1);
    }
    // 将nums中[left..right]的元素反转处理
    private void reverse(int[] nums, int left, int right) {
        while (left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left ++;
            right --;
        }
    }
}